using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace TestImport.View.PlatoBestellingen
{
    public partial class PlatoRetour : Form
    {

        private string filterTekst = "(aBoek = True or isBestelbaarBijPlato = True)";
        private bool isAlleenPlatoBoeken = true;
        private DataView dv;
        private bool isPlato = true;
        
        public PlatoRetour()
        {
            InitializeComponent();
            this.BackColor = InstParameters.Default.schermkleur;
        }

        private void txtBegin_TextChanged(object sender, EventArgs e)
        {

            String text = txtBegin.Text.Replace("\'", "\'\'");
            String filterTekstH = filterTekst + " and Titel like \'%" + (text + "%\'");

            //this.boekBindingSource.Filter = filterTekst;
            this.gbFilter.Text = "Deel van titel " + text.ToUpper();
            this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
            //berekenAantallen();
        }

        private void cmbCategorieZoek_SelectedIndexChanged(object sender, EventArgs e)
        {

            String zoek = cmbCategorieZoek.SelectedValue.ToString();
            String filterTekstH = filterTekst + " and CategorieCode = " + "'" + zoek + "'";

            String text = ((DataRowView)cmbCategorieZoek.SelectedItem).Row["categorieOmschrijving"].ToString(); ;
            this.gbFilter.Text = "Categorie " + text.ToUpper();
            this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
            //berekenAantallen();

        }

        private void cmbUitgeverZoek_SelectedIndexChanged(object sender, EventArgs e)
        {
            String zoek = cmbUitgeverZoek.SelectedValue.ToString();
            String filterTekstH = filterTekst + " and uitgeverCode = " + "'" + zoek + "'";

            String text = ((DataRowView)cmbUitgeverZoek.SelectedItem).Row["uitgeverNaam"].ToString(); ;
            this.gbFilter.Text = "Uitgever " + text.ToUpper();
            this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
            //berekenAantallen();
        }


        private void cmbBoeksoortZoek_SelectedIndexChanged(object sender, EventArgs e)
        {
            String zoek = cmbBoeksoortZoek.SelectedValue.ToString();
            String filterTekstH = filterTekst + " and boeksoortCode = " + "'" + zoek + "'";

            String text = ((DataRowView)cmbBoeksoortZoek.SelectedItem).Row["boeksoortNaam"].ToString(); ;
            this.gbFilter.Text = "Boeksoort " + text.ToUpper();
            this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
            //berekenAantallen();
        }

        private void cmbGroepZoek_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                //Text += "olla ";
                int boeklijstID = -1;
                foreach (DataRow dr in boeklijstTableAdapter.GetGroepCodeID(cmbGroepZoek.SelectedValue.ToString()))
                {
                    boeklijstID = (int)dr["boeklijstID"];
                }
                //Text += " " + cmbGroepZoek.SelectedValue.ToString() + " " + boeklijstID + " ";
                List<int> boekIDs = new List<int>();
                if (boeklijstID != -1)
                {

                    foreach (DataRow dr in boeklijstItemTableAdapter.GetDataByBoeklijstID(boeklijstID))
                        boekIDs.Add((int)dr["boekID"]);
                    //Text += boekIDs.Count.ToString();
                }
                int teller = 0;
                String filterTekstH = filterTekst + " and (boekID = ";
                foreach (int i in boekIDs)
                {
                    filterTekstH += i;
                    if (++teller < boekIDs.Count)
                    {
                        filterTekstH += " or boekID = ";
                    }
                    else
                    {
                        filterTekstH += ")";
                    }
                }
                //Text = filterTekstH;
                String text = ((DataRowView)cmbGroepZoek.SelectedItem).Row["groepCode"].ToString(); ;
                this.gbFilter.Text = "Boekenlijst van groep " + text.ToUpper();
                this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
                //berekenAantallen();
            }
            catch (Exception ex) { ;}


        }

        private void btnAlleBoeken_Click(object sender, EventArgs e)
        {
            String filterTekstH = filterTekst;
            this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
            this.gbFilter.Text = "Alle boeken";
            //berekenAantallen();
        }



        private void PlatoRetour_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'onsBoekenPakketDataSet.Groep' table. You can move, or remove it, as needed.
            this.groepTableAdapter.Fill(this.onsBoekenPakketDataSet.Groep);
            // TODO: This line of code loads data into the 'onsBoekenPakketDataSet.Uitgever' table. You can move, or remove it, as needed.
            this.uitgeverTableAdapter.Fill(this.onsBoekenPakketDataSet.Uitgever);
            // TODO: This line of code loads data into the 'onsBoekenPakketDataSet.Boeksoort' table. You can move, or remove it, as needed.
            this.boeksoortTableAdapter.Fill(this.onsBoekenPakketDataSet.Boeksoort);
            this.leverancierBesteldAantallenTableAdapter.Fill(this.onsBoekenPakketDataSet.LeverancierBesteldAantallen);

            this.categorieTableAdapter.Fill(this.onsBoekenPakketDataSet.Categorie);
            if (isAlleenPlatoBoeken) { leverancierBesteldAantallenBindingSource.Filter = "(aBoek = True or isBestelbaarBijPlato = True)"; filterTekst = "(aBoek = True or isBestelbaarBijPlato = True)"; }
            else { leverancierBesteldAantallenBindingSource.Filter = "aBoek = False"; filterTekst = "aBoek = False"; }
            //dv = leverancierBesteldAantallenBindingSource.List as DataView;
            //dv1 = uitgeverBindingSource.List as DataView;
            this.gbFilter.Text = "Alle boeken";
            dv = leverancierBesteldAantallenBindingSource.List as DataView;
            opzoekenAantallen();
        }

        private void opzoekenAantallen()
        {
            int index = 0;
            // Text += "aantalrij " + dv.Count;
            int vboekID = 0;
            int vafgehaaldAantal = 0;
            object oafgehaaldAantal = null;
            int vbesteldAantal = 0;
            object obesteldAantal = null;
            int vbesteldPlatoAantal = 0;
            object obesteldPlatoAantal = null;
            int vretourPlatoAantal = 0;
            object oretourPlatoAantal = null;
            int vgeleverdAantal = 0;
            object ogeleverdAantal = null;
            foreach (DataRowView drv in dv)
            {
                vboekID = (int)drv["boekID"];
                //opzoeken afhalingen per boek
                try
                {
                    oafgehaaldAantal = leverancierBesteldAantallenTableAdapter.GetAfgehaaldAantal(vboekID);
                    if (oafgehaaldAantal.Equals(DBNull.Value))
                        vafgehaaldAantal = 0;
                    else
                        vafgehaaldAantal = int.Parse(oafgehaaldAantal.ToString());
                }
                catch (Exception ex) { vafgehaaldAantal = 0; }
                drv["raming"] = vafgehaaldAantal;
                //opzoeken Platoretours per boek
                try
                {
                    oretourPlatoAantal = leverancierBesteldAantallenTableAdapter.GetRetourNaarPlatoAantal(vboekID);
                    if (oretourPlatoAantal.Equals(DBNull.Value))
                        vretourPlatoAantal = 0;
                    else
                        vretourPlatoAantal = int.Parse(oretourPlatoAantal.ToString());
                }
                catch (Exception ex) { vretourPlatoAantal = 0; }
                drv["retourPlato"] = Math.Abs(vretourPlatoAantal);
                //opzoeken leveringen per boek
                try
                {
                    ogeleverdAantal = leverancierBesteldAantallenTableAdapter.GetGeleverdAantal(vboekID);
                    if (ogeleverdAantal.Equals(DBNull.Value))
                        vgeleverdAantal = 0;
                    else
                        vgeleverdAantal = int.Parse(ogeleverdAantal.ToString());
                }
                catch (Exception ex) { vgeleverdAantal = 0; }
                drv["geleverd"] = vgeleverdAantal;
                //huidige voorraad
                drv["reserve"] = int.Parse(drv["voorraad1"].ToString()) + int.Parse(drv["geleverd"].ToString()) - Math.Abs(int.Parse(drv["retourPlato"].ToString())) - int.Parse(drv["raming"].ToString());
                //berekenen theoretische retour
                drv["berekendeBestelling"] = Math.Min(vgeleverdAantal - vretourPlatoAantal,int.Parse(drv["reserve"].ToString()) - int.Parse(drv["voorraad1"].ToString()));
                if (int.Parse(drv["berekendeBestelling"].ToString()) < 0) drv["berekendeBestelling"] = 0;
                //drv["teBestellen"] = berekenBerekendeBestelling(index);
                index++;
                drv.EndEdit();
            }
        }

        private int berekenBerekendeBestelling(int index)
        {
            int vAantal = 0;
            int terug = 0;
            /*try
            {
                int nodig = 0;
                if (viaRaming)
                {
                    nodig = int.Parse(dv[index]["raming"].ToString()) + int.Parse(dv[index]["reserve"].ToString()) - int.Parse(dv[index]["voorraad1"].ToString());
                }
                else
                {
                    nodig = int.Parse(dv[index]["besteldLeerling"].ToString()) + int.Parse(dv[index]["reserve"].ToString()) - int.Parse(dv[index]["voorraad1"].ToString());
                }
                int teLeveren = int.Parse(dv[index]["besteldPlato"].ToString()) - int.Parse(dv[index]["geleverd"].ToString());
                int teVeel = int.Parse(dv[index]["besteldPlato"].ToString()) - nodig;
                int retour = 0;
                int annul = 0;
                if (int.Parse(dv[index]["geleverd"].ToString()) > nodig) retour = int.Parse(dv[index]["geleverd"].ToString()) - nodig;
                if (int.Parse(dv[index]["besteldPlato"].ToString()) > nodig)
                {
                    if (teLeveren > 0) annul = Math.Min(teVeel, teLeveren);
                }
                vAantal = nodig - int.Parse(dv[index]["besteldPlato"].ToString());
                if (rbtAnnulatie.Checked)
                {
                    if (annul > 0) terug = annul * (-1);
                }
                else
                {
                    if (rbtRetour.Checked)
                    {
                        if (retour > 0) terug = retour * (-1);
                    }
                    else
                    {
                        if (vAantal > 0) terug = vAantal;
                    }
                }

            }
            catch (Exception ex) { ;}*/
            return terug;
        }

        private void btnRetourIsBerekendeRetour_Click(object sender, EventArgs e)
        {
            DialogResult antwoord = MessageBox.Show("Wens je ALLE te retourneren aantallen vervangen door de berekende retour aantallen??", "OVERSCHRIJVEN TE RETOURNEREN AANTALLEN", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (antwoord == DialogResult.Yes)
            {
                String filterTekstH = filterTekst;
                this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
                foreach (DataRowView drv in dv)
                {
                    drv["teBestellen"] = drv["berekendeBestelling"];
                }
                leverancierBesteldAantallenBindingSource.EndEdit();
                //berekenAantallen();
            }
        }

        private void btnRetourIsNul_Click(object sender, EventArgs e)
        {
            DialogResult antwoord = MessageBox.Show("Wens je ALLE te retourneren aantallen vervangen door 0 ??", "OVERSCHRIJVEN TE RETOURNEREN AANTALLEN", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (antwoord == DialogResult.Yes)
            {
                String filterTekstH = filterTekst;
                this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
                foreach (DataRowView drv in dv)
                {
                    drv["teBestellen"] = 0;
                    drv.EndEdit();
                }
                leverancierBesteldAantallenBindingSource.EndEdit();
                //berekenAantallen();
            }
        }

        private void btnBerekendeRetour_Click(object sender, EventArgs e)
        {
            String filterTekstH = filterTekst + " and berekendeBestelling > 0 ";
            this.gbFilterBis.Text = "Berekende retour > 0";
            this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
        }

        private void btnRetour_Click(object sender, EventArgs e)
        {
            String filterTekstH = filterTekst + " and teBestellen > 0 ";
            this.gbFilterBis.Text = "Te retourneren > 0";
            this.leverancierBesteldAantallenBindingSource.Filter = filterTekstH;
        }

        private void btnAlle_Click(object sender, EventArgs e)
        {
            btnAlleBoeken_Click(null, null);
            this.gbFilterBis.Text = "Alle boeken";
        }

        private void btnRegistreerRetour_Click(object sender, EventArgs e)
        {
            leverancierBesteldAantallenBindingSource.EndEdit();
            verwerkRetour();
        }

        
        private void verwerkRetour()
        {
            string lijst = "";
            int teller = 1;
            int aantal = 0;
            int totaalBestelling = 0;
            int vbesteld = 0;
            int vgeleverd = 0;
            int vannulatieAantal = 0;
            foreach (DataRowView drv in dv)
            {
                try { aantal = int.Parse(drv["teBestellen"].ToString()); }
                catch (Exception) { aantal = 0; }
                if (aantal > 0)
                {
                    try
                    {
                        //vgeleverd = int.Parse(drv["geleverd"].ToString());
                        //aantal = Math.Min(Math.Abs(aantal), vgeleverd);
                        lijst += teller.ToString().PadLeft(4) + ". " + drv["isbnNr"].ToString().PadRight(15) + drv["titel"].ToString().PadRight(65, '.') + drv["categorieCode"].ToString().PadRight(7, '.') + drv["uitgeverNaam"].ToString().PadRight(17) + aantal.ToString().PadLeft(5) + Environment.NewLine;
                        teller++;
                        totaalBestelling += aantal;
                    }
                    catch (Exception ex) { ;}
                }
            }//endforeach
            //MessageBox.Show(lijst);
            string totaalLijn = "Aantal titels: " + (teller - 1) + "   " + "Aantal boeken: " + totaalBestelling;
            PlatoBestellingRegistratie pl = new PlatoBestellingRegistratie(this, totaalLijn, lijst, "RETOUR");
            pl.ShowDialog();
        }

        public void registreerRetour(DateTime bestelDatum, string opmerkingIntern, string opmerkingPlato, string sorteer)
        {
            int vbesteld = 0;
            int vgeleverd = 0;
            string lijst = "";
            int teller = 1;
            int totaalBestelling = 0;
            bool isRetour = false;
            bool isAnnulatie = false;
            string bestand = "";
            string bestandsNaam = "";
            bestandsNaam = @".\Bestellingen\retour_" + bestelDatum.Day + "_" + bestelDatum.Month + "_" + bestelDatum.Year + "_" + bestelDatum.Hour + "_" + bestelDatum.Minute;
            isRetour = true;
            isAnnulatie = false;
            bestand = "Retour van " + InstParameters.Default.naamSchool + "  " + InstParameters.Default.straatSchool + "  " + InstParameters.Default.stadSchool + Environment.NewLine;
            bestand += "Retourdatum: " + bestelDatum.Date.ToString().Substring(0, 10) + Environment.NewLine;
            
            int vstatus = 0;
            int aantal = 0;
            try
            {
                bestellingTableAdapter.InsertBestelling(bestelDatum, isPlato, isRetour, isAnnulatie, bestandsNaam, opmerkingIntern, opmerkingPlato, vstatus);
                int bestelID = (int)bestellingTableAdapter.GetMaxBestellingID();
                if (sorteer.Equals("Categorie")) dv.Sort = "categorieCode";
                if (sorteer.Equals("Titel")) dv.Sort = "titel";
                if (sorteer.Equals("Uitgever")) dv.Sort = "uitgeverCode";
                foreach (DataRowView drv in dv)
                {
                    try
                    {
                        aantal = int.Parse(drv["teBestellen"].ToString());
                        if (aantal > 0)
                        {
                            //vgeleverd = int.Parse(drv["geleverd"].ToString());
                            //aantal = Math.Min(Math.Abs(aantal), vgeleverd);
                            lijst += teller.ToString().PadLeft(4) + ". " + drv["isbnNr"].ToString().PadRight(15) + drv["titel"].ToString().PadRight(65, '.') + drv["categorieCode"].ToString().PadRight(7, '.') + drv["uitgeverNaam"].ToString().PadRight(17) + aantal.ToString().PadLeft(5) + Environment.NewLine;
                            teller++;
                            totaalBestelling += aantal;
                            bestellingItemTableAdapter.InsertBestellingItem(bestelID, int.Parse(drv["boekID"].ToString()), aantal * (-1), 0);
                        }
                    }
                    catch (Exception ex) { ;}
                }
                         
                string totaalLijn = "Aantal titels: " + (teller - 1) + "   " + "Aantal boeken: " + totaalBestelling;

                bestand += totaalLijn + Environment.NewLine + Environment.NewLine;
                bestand += opmerkingPlato + Environment.NewLine + Environment.NewLine;
                bestand += lijst;

                try
                {
                    FileStream aFile = new FileStream(bestandsNaam, FileMode.Create);
                    StreamWriter sw = new StreamWriter(aFile);
                    sw.Write(bestand);
                    sw.Flush();
                    sw.Close();
                }
                catch (IOException e)
                {
                    MessageBox.Show("Er is een probleem opgetreden bij het registreren van de retour/annulatie lijst");
                    return;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }

            //MessageBox.Show(bestand);
            this.Close();
        }

        private void leverancierBesteldAantallenDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            //Dummy
        }

        private void leverancierBesteldAantallenDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (leverancierBesteldAantallenDataGridView.Columns[e.ColumnIndex].Name == "dgvTeRetourneren")
            {
                int vretour = int.Parse(leverancierBesteldAantallenDataGridView.Rows[e.RowIndex].Cells["dgvRetour"].Value.ToString());
                int vgeleverd = int.Parse(leverancierBesteldAantallenDataGridView.Rows[e.RowIndex].Cells["dgvGeleverd"].Value.ToString());
                int vsaldo = vgeleverd - vretour;
                if (e.Value != null)
                {
                    try
                    {
                        int vteRetourneren = int.Parse(leverancierBesteldAantallenDataGridView.Rows[e.RowIndex].Cells["dgvTeRetourneren"].Value.ToString());
                        string stringValue = e.Value.ToString();
                        if (int.Parse(stringValue) != 0)
                        {
                            e.Value = stringValue;
                            e.FormattingApplied = true;
                            if (vteRetourneren > vsaldo) e.CellStyle.ForeColor = Color.Red;
                            else e.CellStyle.ForeColor = Color.Black;
                        }
                    }
                    catch (Exception ex) { }
                }
            }
        }

    }
}
      